約 4,770,863 件
https://w.atwiki.jp/irukakiss/pages/69.html
自宅サーバー・Apche・PHP・PDO・SQLite環境でのメモ帳アプリの活用 メモ帳アプリはすべてが入っている教材でもあるが、実際そのまま使える道具でもある。これをサーバーに置いて本文にHTMLやXMLを書けば、それらの文はそのままWEBページに表示できるでしょ。 極端な話、WEBページのすべての文をデータベースからデータとして拾ってきて構成することもできる。 そこまでやることはないが、例えば新着情報や、日替わりメニューや、リンクや、RSSや、その他頻繁に更新する部分はデータベースのデータとしておけば何時でもどこでもブラウザさえ開ければメモ帳アプリにアクセスして編集できるのだ。極端な話、携帯からでもできるだろう。FTPサーバーもFTPソフト必要ない。 僕は自宅のWindowsパソコン1台をWEBサーバーにしているが、メールはもちろんFTPもやっていない。ポートを開けると、何かと面倒なので。更新は直接書きかえるか、@WikiのFTPにHTML文などを入れて、それを参照している部分はそのファイルを書きかえている。データベースにホームページの内容が入っていれば、そうした不便から開放される。サーバーはWEBサーバーだけでよい。 メモ帳アプリの具体的な使い方 公開しているディレクトリにメモ帳アプリを置かないと「いつでも、どこでも」更新できないので意味がない。公開ディレクトリに置くためには自分(または管理者)しか操作できないように一応の対策をする。国家機密じゃあるまいしそんなに大そうには考えず、PHPによるベーシック認証ですませる。レッツPHP!の小物の中の-パスワード制限-のプログラムを使わせていただく。レッツPHP!というサイトは本当に好感が持てる。シンプルなのによーく考えられている。メモ帳アプリのプログラムの先頭にinclude_once( auth.php );と書くだけでベーシック認証しないとプログラムが走らないようになるのだ。無論パスワードを書いたテキストファイルは公開ディレクトリ以外に置いてフルパスで指定。こうすればかなり悪意がない限りデータを書きかえられることはない。なお、SQLiteのデータベースファイルはこれも公開ディレクトリより上に置けばダウンロードされることもない。かなりセキュア。 メモ帳アプリで「新着情報」、「お知らせ」などのHTMLやRSSのXMLを登録し、実際にそれらを表示するページに次のようなPHPを挿入すればちゃんと表示される。これによって、「いつでもどこでも」手軽に内容を更新できるというわけ。FTPサーバーも、FTPソフトもいらない。ブラウザさえ開くことができる環境なら世界中どこからでも自宅サーバーの更新ができる。 メモ帳アプリに習ってプリペアでやるなら、 ?php // データベースに接続 $conn = new PDO( sqlite memo.sqlite ); $sql = SELECT * FROM memo WHERE id = 5 ; $stmt = $conn- prepare($sql); $stmt- execute(); $row = $stmt- fetch(PDO FETCH_ASSOC); echo $row[ contents ]; $conn = null; ? まあ、でも普通はクエリにSQL文を書くでしょ。 ?php $conn = new PDO( sqlite memo.sqlite );// データベースに接続 $stmt = $conn- query( SELECT * FROM memo WHERE id = 5 );//検索 $row = $stmt- fetch(PDO FETCH_ASSOC);//行全体を連想配列として取得 $conn = null;//接続を切る echo $row[ contents ];//本文を表示 ? この例ではidで検索しているが、titleで「新着情報」とか「お知らせ」とかで検索したほうがわかりやすいと思う。 ?php $conn = new PDO( sqlite 相対指定パス/memo.sqlite );// データベースに接続 $stmt = $conn- query( SELECT contents FROM memo WHERE title = 新着情報 );//検索 $row = $stmt- fetch(PDO FETCH_ASSOC);//行全体を連想配列として取得 $conn = null;//接続を切る echo $row[ contents ];//本文を表示? 普通に表示すると、なぜか「 」だとか漢字の「定」の文字だとかの前にやたらとバックスラッシュが入る。PHPでは普通にあることなのか、それを取り除く関数があるのだ。stripslashesというやつです。これを使えば解決。 だけど根本はフォームでPOSTする度にセキュリティーの関係でこうなるらしい。それで、フォームからのPOSTを受ける$_POSTという連想配列のようそについて、stripslashesを施してやれば、全て解決する。メモ帳アプリであれば、 // データの取得 $act = (isset($_POST[ act ])) ? $_POST[ act ] ; $id = (isset($_REQUEST[ id ])) ? intval($_REQUEST[ id ]) ; $contents = (isset($_POST[ contents ])) ? stripslashes($_POST[ contents ]) ; $title = (isset($_POST[ title ])) ? stripslashes($_POST[ title ]) (無題) ; $dt = date( Y-m-d H i s ); ここのところでやれば他のところは何もしないほうがいい。いろんなところでやると、5C問題にぶち当たる。「ソ」や「表」が文字化け。これは、\を取り除きすぎなんだよ。めったやたらととっぱらっちゃ駄目です。 stripslashesは$_POSTで使えば次のfgetcsvであろうが、shift-jisでも問題なく使える。 メモ帳アプリを改造してCSVファイルをインポート CSVのインポートはGUIやコマンドラインツールに用意されているが、実際やったら文字化けで無理。調べると、SQLiteはUTF-8でないと駄目で、HTMLもUTF-8にしろっていうこと。今更そんなのやってられない。そういう流れだったら逆らえないし、いずれやることになるだろうが、率先してやることはない。SHIFT-JISでいいじゃないか。ふつうにSQLite使えていると思うんだがね。要するにはじめから用意されているやつでやったら、文字化けでお手上げ。この辺のことに悩み出したら、どれだけ時間がかかるかわからない。アミーゴで作ったDBのファイルはCSVにできるので、ともかくこれをさっさとインポートしないと話が始まらない。 というわけで、不器用でも力ずくで、インポートする。PHPのfgetcsvで1行ずつ読み込み、メモ帳アプリのadd_dataファンクションで書き込んでいけばよいだけのこと。文字化けに悩む時間のことを思えば手間はましというもの。 9個ぐらいのフィールドで、ためしにやってみたが110行ほどのCSVをインポートするのに5秒ぐらいかかるかな。1万行じゃあるまいし。この時間は問題にならない。 ポイントは、fgetcsvでCSVデータを1行ずつ読み込んでファイルが終わるまで配列に入れるという原始的方法。 POSTで、読み込むCSVファイルのファイル名のみを取得している。これは当てずっぽうがたまたま当たっているような感じで、邪道かもしれない。普通はフォームで、enctype= multipart/form-data を指定してPOSTすれば$_FILES[ file ][ name ]にファイル名が返るはずだが、どうもそれがうまくいかない。 enctype= multipart/form-data をしなかったら$_POST[ file ]にファイル名が入るのだ。事実として。それでいいじゃないか。できるんだから。 html !-- 1.このプログラムは生成したいデータベースファイルを置く場所(ディレクトリ)と同じ場所に置く。 2.さらに、インポートするcsvファイルを同じ場所に置く。 3.生成するデータベースファイル名確認(69行目 menu.sqlite)。 4.生成するテーブル名確認(72,90,115行目 menu)。 5.このプログラムをブラウザで実行する。 6.インポートするcsvファイルを参照して指定。 7.インポートボタンを押す。 -- head meta http-equiv= Content-Type content= text/html; charset=Shift_JIS title メニューアプリケーション(PDO関数)CSVファイルインポート用 /title meta http-equiv= content-style-type content= text/css style type= text/css !-- .sfont{ font-size 12px } -- /style /head body class= sfont h4 メニューアプリケーション(PDO関数)CSVファイルインポート用 /h4 ?php // データの取得 $act = (isset($_POST[ act ])) ? $_POST[ act ] ; $impfn = (isset($_POST[ impfn ])) ? stripslashes($_POST[ impfn ]) ;//インポートするcsvファイル名 //$dt = date( Y-m-d H i s );//インポートファイルの最終更新日時を採用するときはこの行コメントアウト※54行目を使う // データベースの初期設定 $conn = init(); //処理 if ($act == インポート and $impfn ) { //CSVファイルを開く //$fnで指定するファイルを読み取りモードで開く $fn=$impfn; $fp = fopen($fn, r ); //CSVファイルのパスとファイル名 //CSVデータを1行ずつ読み込んでファイルが終わるまで配列に入れる。 $counter = 1; while ($data = fgetcsv($fp, 10000)) { //変数に代入 //$id=$data[0]; $name=$data[1]; $comment=$data[2]; $hyou=$data[3]; $kakaku=$data[4]; $kakaku2=$data[5]; $bunrui=$data[6]; $aji=$data[7]; $dt=$data[8];//インポート時の最終更新日時を採用するときはこの行コメントアウト※31行目を使う add_data($conn, $name, $comment, $hyou, $kakaku, $kakaku2, $bunrui, $aji, $dt); //Wile文の終端 $counter++ ; } //ファイルを閉じる fclose($fp); //if文の終端 echo $impfn. をインポートしました。 ; } // データベースの初期設定 function init() { // データベースに接続(カレントフォルダのmenu.sqliteというファイル名) $conn = new PDO( sqlite menu.sqlite ); // データベースの作成 $sql = CREATE TABLE IF NOT EXISTS menu ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, comment TEXT NOT NULL, hyou, kakaku, kakaku2, bunrui, aji, dt TEXT NOT NULL ) ; $stmt = $conn- prepare($sql); $stmt- execute(); return $conn; } // データの追加 function add_data($conn, $name, $comment, $hyou, $kakaku, $kakaku2, $bunrui, $aji, $dt) { $sql = INSERT INTO menu(name, comment, hyou, kakaku, kakaku2, bunrui, aji, dt) VALUES( name, comment, hyou, kakaku, kakaku2, bunrui, aji, dt) ; $stmt = $conn- prepare($sql); $stmt- bindParam( name , $name); $stmt- bindParam( comment , $comment); $stmt- bindParam( hyou , $hyou); $stmt- bindParam( kakaku , $kakaku); $stmt- bindParam( kakaku2 , $kakaku2); $stmt- bindParam( bunrui , $bunrui); $stmt- bindParam( aji , $aji); $stmt- bindParam( dt , $dt); $stmt- execute(); $id = $conn- lastInsertId(); return $id; } ? !-- フォーム -- form method= POST action= ?php echo $_SERVER[ SCRIPT_NAME ]? input type= file name= impfn size= 30 input type= submit value= インポート name= act onClick= return confirm( インポートします ) /form ?php // 全データの取得 $sql = SELECT * FROM menu ORDER BY id ; $stmt = $conn- prepare($sql); $stmt- execute(); // データの一覧表示 echo table class=\ sfont\ border=\ 1\ ; echo tr ; echo td ID /td ; echo td 名称 /td ; echo td 得票 /td ; echo td 価格 /td ; echo td 最終更新時刻 /td ; echo /tr ; while ($row = $stmt- fetch()) { echo tr ; echo td . $row[ id ] . /td ; echo td . $row[ name ] . /td ; echo td . $row[ hyou ] . /td ; echo td . $row[ kakaku ] . /td ; echo td . $row[ dt ] . /td ; echo /tr ; } echo /table ; ? /body /html ともかくこれで、アミーゴのデータを全部SQLiteに移行した。文字化けなし。 全くなし。 SHIFT-JISであろうとfgetcsvであろうと文字化けなし。 $_POSTだけバックスラッシュ取ればいいのだ! 文字化けアレルギーにかかっていた。 stripslashesは、やたらと使うもんじゃない。これを使いすぎて、\が無くなって,逆に5C問題が発生する。基礎的な設定が正しければstripslashesはPOSTを受けた直後の$_POSTにだけ施せばよろしい。例えば、stripslashes($_POST[ comment ])みたいにPOSTを受ければそれで何もかもうまくいく。下手に対処療法ばかりやってはいけない。対処療法が症状を生みさらに対処療法をするとそれがまた症状を生むという悪循環に陥る。おおもとの部分を解決しなければ永遠のいたちごっこになる。 カクテルはさすがに26種類のフィールドで、486行だから時間がPHP既定の30秒では足りず、 Fatal error Maximum execution time of 30 となった。 プログラムの先頭に秒数を書く。120秒でどうだ。 set_time_limit(120); 結果、65秒であった。2年かけて入力したデータだからな。65秒ぐらいかかってくれたほうがうれしい。 $conn = new PDO( sqlite パス/cocktail.db );// データベースに接続 $stmt = $conn- query( SELECT count (*) FROM cocktail where {$where} );//countで、セレクトされる行数を取得する。 $total = $stmt- fetchColumn();//カウントの結果はこれで。なお(*)は(id)などnotnullのフィールドでもいい。 $conn = null;//接続を切る 検索結果の表示でページャー(ページ送り機能)を使いたかったので、検索結果件数を上のコードで取得。{$where}はWhere句の内容。 ページャーはレッツPHPさんのお世話になりました。よくできたプログラム。わかりやすいし。 http //php.s3.to/simple/
https://w.atwiki.jp/hama170628/pages/24.html
Oracle10gXEインストール ダウンロード http //www.oracle.com/technology/software/products/database/xe/index.html # rpm -ivh /media/cdrecorder/Fedora/RPMS/libaio-0.3.104-2.i386.rpm 準備中... ########################################### [100%] 1 oracle-xe-univ ########################################### [100%] Executing Post-install steps... You must run /etc/init.d/oracle-xe configure as the root user to configure the database. [root@]# ls Desktop oracle-xe-univ-10.2.0.1-1.0.i386.rpm [root@]# /etc/init.d/oracle-xe configure Oracle Database 10g Express Edition Configuration ------------------------------------------------- This will configure on-boot properties of Oracle Database 10g Express Edition. The following questions will determine whether the database should be starting upon system boot, the ports it will use, and the passwords that will be used for database accounts. Press Enter to accept the defaults. Ctrl-C will abort. br() Specify the HTTP port that will be used for Oracle Application Express [8080] Specify a port that will be used for the database listener [1521] Specify a password to be used for database accounts. Note that the same password will be used for SYS and SYSTEM. Oracle recommends the use of different passwords for each database account. This can be done after initial configuration Confirm the password Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y] Starting Oracle Net Listener...Done Configuring Database... Done Starting Oracle Database 10g Express Edition Instance...Done Installation Completed Successfully. To access the Database Home Page go to "http //127.0.0.1 8080/apex" 起動 #/etc/init.d/oracle-xe start 停止 #/etc/init.d/oracle-xe stop OS起動時にデータベースを開始する設定にした場合は、 #service oracle-xe { start | stop } 接続するユーザの.bash_profileに以下を追加 . /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh [root@netv01 admin]# sqlplus SQL*Plus Release 10.2.0.1.0 - Production on 土 3月 31 03 23 03 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved. ユーザー名を入力してください SYSTEM パスワードを入力してください デフォルトはMANAGER Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production ログオンせずに起動する場合は $ sqlplus /nolog SQL*Plus Release 10.2.0.1.0 - Production on 水 11月 4 00 05 30 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. ※起動した後で接続 SQL connect system/XXXX @192.168.1.XXX/XE ネットワーク設定の編集 ※編集せずに起動可能 場所 /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/ ①listener.ora # listener.ora Network Configuration File SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = XE) (GLOBAL_DBNAME = XE.send.test) (ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = netv01.send.test)(PORT = 1521)) ) ) ) ②tnsnames.ora # tnsnames.ora Network Configuration File XE = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = netv01.send.test)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = XE.send.test) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) 接続テスト: SQL connect system/**pass**@netv01.send.test 1521/XE SQL create table mail_test( 2 no number, 3 from_addr varchar2(256), 4 rcpt_addr varchar2(256), 5 count number 6 ); SQL create user hama identified by hama ; SQL update mail_test set count=count+1 where FROM_ADDR= tome@send.test AND RCPT_ADDR= hama@recv.test ;
https://w.atwiki.jp/hide1227/pages/16.html
【参考文献】:AJAX HACKS 6章 Hacks45-52(p207~) MVCアーキテクチャ MVCとはデザインパターンの一種で、アプリケーションの構成を、Model、View、Controllerというコンポーネントに分けて設計する手法を言う。 Ruby On Rails のインストール 編集中。。。あまりここに時間を割きたくないな。ぼそ ここでは、InstantRails-1.7-win.zipを導入して使います。 Rails アプリの作成 1.開発環境 始める前に、念のため開発に使用するマシンのスペックを調べておきます。 Windows XP SP2 であれば、まあ問題ないでしょう。今回はWindows2000でやってみます。 ちなみに、マシンスペックの調べ方は、コマンドで「dxdiag」 C \InstantRails\rails_apps dxdiag 今回の開発環境のサンプル) ------------------ System Information ------------------ Time of this report 10/16/2008, 09 52 20 Machine name HIDE2000 Operating System Windows 2000 Professional (5.0, Build 2195) Service Pack 4 Language Japanese (Regional Setting Japanese) System Manufacturer VMware, Inc. System Model VMware Virtual Platform BIOS Default System BIOS Processor Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz, ~2.4GHz Memory 724MB RAM Page File 408MB used, 1049MB available Windows Dir C \WINNT DirectX Version DirectX 9.0c (4.09.0000.0904) DX Setup Parameters Not found DxDiag Version 5.03.0001.0904 32bit Unicode 【補足:開発支援の為のIDE Tool】 開発支援の為のIDEToolとして、eclipseかAptanaかNetBeansなどを利用すると便利だと思います。 今回は「eclipse」に「Aptana」プラグイン、「RadRails」プラグインを仕込んで使います。(※) ※)手っ取り早く環境を構築するには? これらが全部そろった「pleiades-all-in-one-ultimate_20081006.zip」がお勧めです。(=>ダウンロードはこちらから。Eclipse 3.4.1 Ganymedeのultimateがお勧めです。ちなみに3.3.1のほうにはultimateでも今回使いたいRadRailsのプラグインが入ってませんでした。。。) ※) eclipse 3.2.1 に RadRailsプラグインを追加する方法 AptanaプラグインとRailsプラグインのインストール Eclipseを起動し、「ヘルプ」→「ソフトウェアの更新」→「検索してインストール」を選びます。 ダイアログボックスが出たら「新規フィーチャーを探す」を選びます。 アップデートサイト選択画面で「新規リモート」を選びます。 ここでは次の2つのサイトを登録します。 ・http //update.aptana.com/install/3.2/ ・http //update.aptana.com/install/rails/3.2/ 1つ目がAptana本体、2つ目がAptanaのRailsプラグインになります。 リモートサイトを2つ登録し終わったら、「次へ」をクリックし、 以降は通常の更新機能と同様に操作して、インストールを行います。 Railsパースペクティブを開く プラグインのインストールが終わり、Eclipseを再起動したら、 Railsパースペクティブを開きます。 「ウィンドウ」→「パースペクティブを開く」→「その他」の中に 「Rails」というパースペクティブがあるので、これを選択します。 ここを参考にしました。http //blog.codezine.jp/editor/2007/06/aptana_eclipseruby_on_rails_1.phpちなみに、3.3.x だとうまくいきません。3.3用のURLもどこかにあると思いますが、 それは調べていません。 2.Railsのヴァージョン Railsの開発の場合、特にヴァージョンの組み合わせは重要です。 今回は、InstantRails-1.7-win.zipをインストールして準備した環境なので、「Rails 1.2.3」になります。このヴァージョンが現在最も情報量が豊富です。(=>ダウンロードはこちらから。) ※ rubyの最新の1.9などは1.8.6に比べてだいぶ変わったようですし、フレームワークであるrailsもヴァージョンが1.2.X系と2.X系ではscaffoldなどかなりやり方が異なります。パッケージ管理Toolであるgemなども実はgem自体のヴァージョンによりインポートできるモジュールのヴァージョンが違ったりと、手抜かりがあるとなかなか手こずりますので注意しましょう。 C \InstantRails\rails_apps ruby -vruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] C \InstantRails\rails_apps gem envRubyGems Environment - VERSION 0.9.2 (0.9.2) - INSTALLATION DIRECTORY C /InstantRails/ruby/lib/ruby/gems/1.8 - GEM PATH - C /InstantRails/ruby/lib/ruby/gems/1.8 - REMOTE SOURCES -http //gems.rubyforge.org C \InstantRails\rails_apps rake --version rake, version 0.7.2 C \InstantRails\rails_apps rails --version Rails 1.2.3 C \InstantRails\rails_apps mysql --version mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) ・ もうひとつのヴァージョンの調べ方 ひとつひとつのコマンドを打ち込んでヴァージョンを調べてもいいけれども、Railsの場合たくさんのパッケージやモジュールで構成されていて調べるのはいささか面倒です。そこで一発でこれらを調べるコマンドを紹介します。ただし、これはプロジェクト内部のaboutコマンドなので、少なくとも後述するプロジェクトを何かひとつ作成してから、実行してください。 // これはうまくいきません。 C \InstantRails\rails_apps ruby script/about C \InstantRails\rails_apps\hacks ruby script/aboutAbout your application s environmentRuby version 1.8.6 (i386-mswin32) RubyGems version 0.9.2 Rails version 1.2.3 Active Record version 1.15.3 Action Pack version 1.13.3 Action Web Service version 1.2.3 Action Mailer version 1.3.3 Active Support version 1.4.2 Application root C /InstantRails/rails_apps/hacks Environment development Database adapter mysql 3.作成手順 RailsアプリはDB利用を前提としたWebアプリになるため、Railsの命名規則が重要になってきます。ここら辺はDRYやCoCの思想によるところですが、今回のAjax用のRailsアプリサンプルとして以下の情報をまず収集します。 プロジェクト名:プロジェクトのルートとなる名前、主にフォルダ管理のため。 使用するRDB:MySQL,SQLite3,PostgreSQL,SQL Server,DB2,Oracle DB名:開発用、テスト用、リリース用の三種類を用意します。 テーブル名:複数形小文字英数字 モデル名:原則としてテーブル名と関連します。単数形のテーブル名 それでは、今回のAjax用のRailsアプリサンプルの情報を定義していきましょう。 プロジェクト名:hacks 使用するRDB:mysql DB名:hacks_development,hacks_test,hacks_production テーブル名:kilowatts モデル名:Kilowatt ここで、一応テーブルの定義も決めておきましょうか。 Kilowattsテーブル定義 NO カラム名 型 NotNull 主キー 1 id int true true 2 kdate text 3 kwatts int DDLファイルを作成するとしたら、以下のようになるかと思います。(※) DDL kilowatts.sql DROP TABLE IF EXISTS kilowatts; CREATE TABLE kilowatts ( id MEDIUMINT NOT NULL AUTO_INCREMENT, kdate TEXT, kwatts INT, PRIMARY KEY(id) ); ※)ただし、Railsの作成方法では、このようなDB周りの準備もRailsでサポートされており、具体的には「マイグレーション」という手法を使います。ちなみに、この作成方法はRails 1.2.x 系列とRails 2.x 系列で作成手順が違います。これは追って説明します。 【参考】:ソースダウンロード ちなみに、このページはUTF8になります。ブラウザで文字化けなどしたらエンコードを変更してみてください。AjaxHacksSamples.zipを解凍してサンプルコードを手に入れてください。 【事前準備】 InstantRailsでインストールした場合は、InstantRails.exe は起動しておきましょう。起動するとApacheとMySQlが立ち上がります。後ほどRailsからDBを作成したり、テーブルを作成しますが、そのためには今回使用するMySQLがサービスとして起動している必要があります。Webサーバは開発モードでは他の(Mongrelサーバ)を使うのでApacheは立ち上げる必要性はないですが、DBの確認作業で、phpMyAdminというToolを使う場合はApacheサーバを立ち上げておく必要があります。 また、DBにMySQLを使用するのであれば、最初に、my.iniファイルにてDBの文字コード指定をしておきます。以下のソースの青字部分を追記してください。 C \InstantRails\mysql\my.ini ; ---------------------- IMPORTANT ---------------------------; ; ${path} is used to specify Instant Rails installation path. ; ;-------------------------------------------------------------; [mysqld] datadir=${path}/mysql/data basedir=${path}/mysql bind-address=127.0.0.1 ; Uncomment for use on USB key ; skip-innodbdefault-character-set=utf8 skip-character-set-client-handshake ここまで準備すれば、雛形部分の作成は15分もかからないでしょう。 【プロジェクトの作成】 // 1.0 railsアプリのルートフォルダに移動 // InstantRailsでインストールした場合には、その下に「rails_apps」があるはず。そこです。C \ cd C \InstantRails\rails_apps // 2.0 railsコマンドの実行 // 通常は、Rails 1.2.3 の場合、DBは mysql になります。 // rails hacks // // デフォルトじゃないDBシステムを指定するには // rails hacks -d mysql // かもしくは、 // rails hacks --database=mysql //C \InstantRails\rails_apps rails hacks -d mysql 【DB作成】 DBの作成の仕方には幾通りかあります。各ベンダーにより簡単なやりかたがそれぞれあるでしょうが、RailsにはrakeコマンドでDB作成Toolを作成することもできます。それを使用すればマルチDBの作成が夢ではないと思いますが、それは次回のテーマに譲ることにして、ここでは、使用するDBをMySQLとした場合、InstantRails導入した際に利用できるphpMyAdminを使用して簡単に作成してしまいましょう。InstantRails.exeが立ち上がっている状態であれば、以下のURLにアクセスできるはずです。 http //127.0.0.1/mysql/ 今回作成するDBは三種類です。 hacks_development hacks_test hacks_production これは先ほどのプロジェクトの作成の際に自動で命名規約されているDB名です。もちろんこれを変更することも可能ですが、それは以下のリソースに定義してあります。まず素直に自動生成されたソースを覗いてみましょう。 C \InstantRails\rails_apps\hacks\config\database.yml development adapter mysql database hacks_development username root password host localhost test adapter mysql database hacks_test username root password host localhost production adapter mysql database hacks_production username root password host localhost 今回はここでデフォルトに指定されているDB名をそのまま使用することにします。DB名を変えたければ、[database ]の値を変えればいいでしょう。 ちなみに、今回はMySQLなのでこのまま使用しますが、Oracleなどの場合は、DBを複数作成するよりも、スキーマを3つ用意したほうが現実的だと思われます。 【補足:文字コード問題】 my.iniに指定したように、このdatabase.ymlファイルでも文字コードを指定します。3つのDB定義の最後の要素にそれぞれ以下を追加します。(※MySQL使用時には必要ですがOracle使用する場合は必要がないようです。) encoding utf8 また、文字コード問題というと、DBの文字コードだけでなく、Ruby自体の文字コード指定をする必要があります。 今回のRailsアプリの文字コード指定は、「environment.rb」というファイルでの最初の行で設定します。 例)文字コードをUTF-8に指定するやりかた。 $KCODE = "UTF8" もしくは、 $KCODE = u どちらも同じ意味です。最初の 1 バイトしか読み取っていないようです。しかも大文字小文字すら関係ないようです。でも自分としては可読性を考慮してUTF8と記述したいところです。 【参考サイト】http //www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html では、phpMyAdminのサイトにてこれらの3つのDBを作成してみましょう。 確認は、phpMyAdminでもできますが、コンソールからDBが作成されたことを確認してみます。 C \InstantRails\rails_apps\hacks mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version 5.0.27-community Type help; or \h for help. Type \c to clear the buffer. mysql show databases; +----------------------------------------+ | Database | +----------------------------------------+ | information_schema | |hacks_development | |hacks_production | |hacks_test | +----------------------------------------+ 29 rows in set (0.01 sec) mysql 【eclipse へインポート】 この辺で、今後の作業の円滑を図り、eclipseへプロジェクトごとインポートしておきます。 プロジェクトを選択 選択してOK押下 作成されたことを確認 プロジェクトをマウントしたら、すかさずeclipseプロジェクト上の文字コードをUTF8に設定する。 【テーブルの作成】事前準備してあるテーブル定義書に従い、Rails用のDDLファイルといえるマイグレーションファイルを作成します。 作成の手順は、Rails 1.2.3 と Rails 2.0.2 では微妙に異なります。Rails 1.2.3では、 ジェネレータの「migration」サブコマンドにてマイグレーションファイルのスタブを作成して後 テーブル定義書に従い、マイグレーションファイルの編集 「db migrate」コマンドを実行する。 その後、「scaffold」を実行し、テーブルに対応するモデルクラスやコントロールクラスのCRUD構成を一気に作成する。 という手順になるが、Rails 2.0.2では 「scaffold」にて、MVCアーキテクチャのすべてのソースを一気に作成する。 「db migrate」コマンドを実行する。 ただし、その際の「scaffold」のコマンドオプションの指定の仕方が変わりました。カラム名や型を同時に宣言しなければならなくなりました。 ここでは、Railsのヴァージョンは 1.2.3 なので、最初の手続きによるやり方で行う。 ちなみに、eclipse の RadRailsパースペクティブにおいては、generatorというviewが存在し、 そこでコマンドを実行が可能です。 ここでは、コマンドラインでの実行方法を紹介します。(Rails 1.2.3の場合) C \InstantRails\rails_apps\hacks ruby script/generate migration create_kilowatts create db/migrate create db/migrate/001_create_kilowatts.rb C \InstantRails\rails_apps\hacks ちなみに、Rails 2.0.2の場合は migrationではなく、ここでいきなりscaffold していいです。 C \InstantRails\rails_apps\hacks ruby script/generate scaffold kilowatt kdate text kwatts integer では、eclipse に戻って、作業領域をリフレッシュ(F5)した後、編集してみましょう。 001_create_kilowatts.rb(Rails 1.2.3の場合) class CreateKilowatts ActiveRecord Migration def self.up create_table( kilowatts) do |table| table.column kdate , text table.column kwatts , integer end end def self.down drop_table kilowatts end end 001_create_kilowatts.rb(Rails 2.0.2の場合) class CreateKilowatts ActiveRecord Migration def self.up create_table( kilowatts) do |table| table.text kdate table.integer kwatts end end def self.down drop_table kilowatts end end (※注意) Rails1.2.3とRails2.0.2の表記の違いに注意してください。また2.0.2の場合、自動生成される「table.timestamps」ですが、これはカラムの「create_at」と「update_at」に相当します。 このマイグレーションファイルはマルチDBに対応したRails独自の文法による記載になります。 非常に便利なものだが、まず各ベンダーのRDBの型との対応に注意しなければなりません。 手元には、データ型の対応表が必要になると思われる。 型 説明 MySQL SQL Server Oracle id プライマリキー int(11) int NUMBER(38) string 文字列 varchar(255) varchar(255) VARCHAR(255) text 長い文字列 text text CLOB integer 整数 int(11) int NUMBER(38) float 浮動少数 float real NUMBER decimal 精度の高い小数 decimal(10,0) decimal(18,0) NUMBER(38) datetime 日時 datetime datetime DATE timestamp 日時(より細かい) datetime datetime DATE time 時間 time datetime DATE date 日付 date datetime DATE binary バイナリデータ blob image BLOB boolean Boolean型 tinyint(1) bit NUMBER(1) create_at マジックフィールド datetime datetime DATE update_at マジックフィールド datetime datetime DATE 次に「rake db migrate」コマンドを実行する。(ちなみに eclipse の Rake view からも実行が可能だ。) C \InstantRails\rails_apps\hacks rake db migrate == CreateKilowatts migrating ================================================= -- create_table( kilowatts) - 0.0780s == CreateKilowatts migrated (0.0780s) ======================================== この時、「テーブル schema_info」も同時に作成されていることに着目しておこう。これはマイグレーションにおける履歴管理のためのテーブルで、Railsの管理の下、テーブル定義が仕様変更となっても、すぐに反映させたり、また逆に元に戻すことを可能にした仕組みだ。 この点を踏まえると、Railsを使うならば、マイグレーションなしに勝手にテーブル作成することは好ましくないといえるだろう。 【テーブル作成の確認】 C \InstantRails\rails_apps\hacks mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 to server version 5.0.27-community Type help; or \h for help. Type \c to clear the buffer.mysql use hacks_development; Database changedmysql show tables; +-----------------------------+ | Tables_in_hacks_development | +-----------------------------+ | kilowatts | |schema_info | +-----------------------------+ 2 rows in set (0.00 sec) mysql 【足場の作成】 ここで足場となるMVCアーキテクチャに沿ったソースを自動生成します。そのためのコマンドとして、先ほど紹介した「scaffold」というコマンドがあります。 C \InstantRails\rails_apps\hacks ruby script/generate scaffold kilowatt exists app/controllers/ exists app/helpers/ create app/views/kilowatts exists app/views/layouts/ exists test/functional/ dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/kilowatt.rb create test/unit/kilowatt_test.rb create test/fixtures/kilowatts.yml create app/views/kilowatts/_form.rhtml create app/views/kilowatts/list.rhtml create app/views/kilowatts/show.rhtml create app/views/kilowatts/new.rhtml create app/views/kilowatts/edit.rhtml create app/controllers/kilowatts_controller.rb create test/functional/kilowatts_controller_test.rb create app/helpers/kilowatts_helper.rb create app/views/layouts/kilowatts.rhtml create public/stylesheets/scaffold.css ここまでで雛形が完成したはずです。 【動作確認】 では、早速サーバを起動させてみましょう。WebサーバはRailsでは複数用意されていますが、開発モード時点ではApacheなどは使わないです。(かといって現在あがっているApacheを落とす必要はありません。)簡易サーバとして、Mongrelサーバというものが、ありますので、今回はそれを使用します。 サーバー起動のやり方は、コマンドラインとeclipseでの起動のさせ方とありますが、ポート番号まで比較的簡単に指定できるeclipse起動のやり方を紹介します。 まず、eclipseにて対象となるプロジェクト(今回の場合は「hacks」)を選択して、Runします。 ここでOKを押下すれば、対象のサーバインスタンスが立ち上がるはずなのですが、実際には別のインスタンスが起動してしまうような現象に遭遇しました。ヴァージョンは、3.2.1でも3.4.1でも起こります。なのでその場合は、一旦関係のないサーバインスタンスを停止し、再度Serversヴューにて起動対象のサーバインスタンスを選択して実行してみてください。 以上のように起動すれば、Webアプリが起動されているはずです。 以下のURLをブラウザで指定してみましょう。 (今回はIP指定しますが、普段の開発ではHOSTはlocalhostか127.0.0.1でかまわないでしょう。) // 今回のURLhttp //192.168.1.29 3008/kilowatts/ // 通常はデフォルト指定のままなので以下のURLhttp //localhost 3008/kilowatts/http //127.0.0.1 3008/kilowatts/ ホスト名の次に指定するURIの要素がテーブル名になっていることに着目してください。 また、デフォルトの入り口が、indexになるのですが、実際にはlist画面にリダイレクトされています。ここは、Railsの仕組みをもう少し追いかけていくことで判明します。 とりあえず、ここまでで Railsのアプリの土台部分がが作成できました。 おめでとうございます!! Ajaxライブラリの導入方法 Ajaxには多数のライブラリが存在しており、現在では生で「XMLHttpRequest」オブジェクトを操作することはあまり機会がなくなっているといえるんではないでしょうか。最も有名なライブラリは「Prototype」ですが、これはどうやらRuby On Railsがそのルーツだそうです。ということで Railsをやるならデフォルトでついてきてます。 %= javascript_include_tag defaults% この記述でHTMLソースにはどのように変換されているか調べてみると、 script src="/javascripts/prototype.js?1224125580" type="text/javascript" /script script src="/javascripts/effects.js?1224125580" type="text/javascript" /script script src="/javascripts/dragdrop.js?1224125580" type="text/javascript" /script script src="/javascripts/controls.js?1224125580" type="text/javascript" /script script src="/javascripts/application.js?1224125580" type="text/javascript" /script でした。 自動生成された javascriptライブラリをこの一行でロードしています。一番お手軽な書式ですが、必要なものだけを指定したほうが効率がいいでしょう。その場合は、 %= javascript_include_tag"prototype.js"% ところで、このロードの順番は重要です。前後を入れ替えないこと。 逆に言うと、自分で定義した javascript関数は一番最後にロードされる「application.js」に入れるべきです。 XMLHttpRequestの使い方 XMLHttpRequestの使い方を調べるためにサンプルを作成しましょう。 RailsではXMLHttpRequestを生で使わないとはどういうことでしょうか? ひとつには、ライブラリ「prototype.js」を内部で利用しているため、そのラッパークラスを通じて操作できるためです。 しかし、Railsの場合は、さらにそれをラッピングしたメソッドが存在し、それを利用することができます。 まず、それを確かめるためのコントロールとヴューを作成したいと思います。 ここで、今回はDBを使わないので、あえてscaffoldはせずに、generateではコントローラだけを指定してモデルは作成しないことにします。必要なのはアクションとその画面のみ…ということで、このようなコマンドを実行してみます。 C(コントローラ) hacks V(ヴュー) monitor C \InstantRails\rails_apps\hacks ruby script/generate controller hacks exists app/controllers/ exists app/helpers/ create app/views/hacks exists test/functional/ create app/controllers/hacks_controller.rb create test/functional/hacks_controller_test.rb create app/helpers/hacks_helper.rb コントローラですが、hacks_controller.rb はJavaでいえばサーブレットみたいなものです。URIにも反映されます。V(ヴュー) monitorはまだここでは作成してませんが、アクション名でもあり、コントローラに実装するメソッド名でもあり、Viewとしてのrhtmlファイル名であったりします。この命名規則がしっかりしたところが、Railsが優れた生産性を誇る仕組みでもあります。この恩恵は非常に効率的ですね。MVCに着眼すれば、これからの作業の太枠が決まります。 コントローラのスタブメソッド作成 ヴューの作成 URLの決定 まずアクセス先のURLを決めてしまいます。 http //192.168.1.29 3008/hacks/monitor にすることにして、 コントローラのスタブメソッド作成します。(file ///C /InstantRails/rails_apps/hacks/app/controllers/hacks_controller.rb) class HacksController ApplicationController def index # # URI省略時のインデックスページの処理。特定のアクションにたらい回します。 # monitor render action = monitor end def monitor # # ここに処理を書きます。アクセス時の業務処理です。 # end def tmp # # ここに処理を書きます。まだメソッド名も決めてませんが「送信ボタン」に対応するアクションです。 # end end ヴューの作成 レイアウトをまず決めます。対応するコントローラに対して1本作成します。 file ///C /InstantRails/rails_apps/hacks/app/views/layouts/hacks.rhtml これは、外枠だけの入れ物なので、既存のレイアウトをそのまま複製してしまいます。タイトルくらいはそれらしく編集しておきましょう。 !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http //www.w3.org/1999/xhtml" xml lang="en" lang="en" head meta http-equiv="content-type" content="text/html;charset=UTF-8" / %= javascript_include_tag defaults % %= stylesheet_link_tag scaffold % title Ajax呼び出し時の内部状態 %= controller.action_name % /title /head body p style="color green" %= flash[ notice] % /p %= yield % /body /html yieldに入るアクションごとの部品ヴューは file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml になるでしょう。 内容は、 h1 Monitor /h1 % form_tag action = tmp do % %= render partial = form % %= submit_tag 送信 % % end % な感じにしておきます。送信ボタン押下時のメソッド名をそろそろ決めておかないといけませんが、とりあえず、こうしておきます。 画面自体は出ることをサーバにて確認できます。 では、ここからいよいよメインディッシュにんります。RailsでAjaxを使うには、対応するいくつかのメソッドが用意されています。XMLHttpRequestでは「form_tag」は使用しないのです。その代わりに「form_remote_tag メソッド」を使用します。 form_remote_tag メソッド XMLHttpRequestの機能を活用するためのメソッドです。 基本構造は、 %=form_remote_tag(...param...) % div /div p %= submit_tag 送信 % /p %=end_form_tag% パラメータ部分は多少複雑です。ハッシュ形式の指定方法です。 それぞれのキー項目をみていきます。赤字は必須指定。 update = "" url = {} position = "" success = "" loading = "" loaded = "" interactive = "" failure = "" update = "表示要素のid属性値" なんだけれどもここは結構重要です。肝です。 completeや success指定との違いがわかりづらいのです。ここに参考にできる記事がありますが、もっと調べておく必要性を感じます。 url = { action = リクエストを処理するアクションのシンボル } position = "挿入位置" success = "XMLHttpRequestのreadystateが成功時" ちなみに、readystateがsuccess というのは厳密にはないはずなのだが、指定できるそうだ。completeとほとんど似た状態だが、わずかに successのほうが早い状態になります。 complete = "Element.toggle( id属性値 )" readystate 状態 意味 0 uninitialized 初期化されていない 1 loading 読み込み中 2 loaded 読み込み完了 3 interactive 操作可能 4 complete 準備完了 file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml %= form_remote_tag ( update = "complete", url = { action = zero_update }, position = "top", success = "$( success ).innerHTML= 成功; ステータスコード= +request.status", loading = "$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status", loaded = "$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status", interactive = "$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status", failure = "$( failure ).innerHTML= エラー; ステータスコード= +request.status") % h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p %=submit_tag 送信 % /p %=end_form_tag % file ///C /InstantRails/rails_apps/hacks/app/views/hacks/monitor.rhtml defzero_update # # ここに処理を書きます。まだメソッド名も決めてませんが「送信ボタン」に対応するアクションです。 # render text = "Ajax hello!!!" end render text = "Ajax hello!!!" ここが遷移しない仕組みです。遷移先の画面指定などはしていないのです。この例ではサーバ側の固定文字列を返していますが、コントローラで料理ができるということは、「可変データを非同期に返せる」ということです。静的なサーバ上のデータを返したいだけであるならば、もっと別の手法があります。その手法は別のテーマで触れる予定です。 変換後のHTMLは form action="/hacks/zero_update" method="post"onsubmit="new Ajax.Updater( complete , /hacks/zero_update , {asynchronous true, evalScripts true, insertion Insertion.Top, onFailure function(request){$( failure ).innerHTML= エラー; ステータスコード= +request.status}, onInteractive function(request){$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status}, onLoaded function(request){$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status}, onLoading function(request){$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status}, onSuccess function(request){$( success ).innerHTML= 成功; ステータスコード= +request.status}, parameters Form.serialize(this)}); return false;" h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p input name="commit" type="submit" value="送信" / /p /form 内部では、prototype.jsのクラスが使用されているようです。 しかも変換されているのは、「Ajax.Request」ではなく「Ajax.Updater」のようです。ほとんど似た処理ですが、サーバ上のデータをページに非同期に挿入するのに使います。 非同期の持ち味を実感するには、クライアントサイドで「onSubmit」とか「onClick」とかでは、実感が薄いですね。 トリガーとなるイベントの種類や指定方法も整理しておくといいでしょう。 その前に、 successと completeの違いについて整理しておきます。上記のソースの実行結果は、実は問題があります。 successと completeの違いについて どちらもサーバからレスポンスが返される準備が整った状態ではありますが、ステータスでいうと、まず successになり、次に completeになります。これを同じ意味と捕らえるのはもったいないことです。実際に updateで指定された要素に結果が挿入されるのは、 completeのタイミングですが、そもそも非同期処理のため、ページが遷移せず、つまりは既読のデータ(id=completeで指定された領域のデータ)は消えないのです。そのため、前回サーバより取得した値は消えずに残り、そこに追記という形で対象要素にロードされるため、意図した結果にならないでしょう。その場合に、 successのステータスにおいて対象要素の「過去の値」を消す処理を施すことができます。 %= form_remote_tag ( update = "complete", url = { action = zero_update }, position = "top", success = "$( complete ).innerHTML= ;$( success ).innerHTML= 成功; ステータスコード= +request.status", loading = "$( loading ).innerHTML= リクエスト送信中…; ステータスコード= +request.status", loaded = "$( loaded ).innerHTML= リクエスト送信完了; ステータスコード= +request.status", interactive = "$( inter ).innerHTML= レスポンス受信中; ステータスコード= +request.status", failure = "$( failure ).innerHTML= エラー; ステータスコード= +request.status") % h3 Ajax呼び出しの内部状態を表示します /h3 div id="loading" style="font-size 1.2em" /div div id="loaded" style="font-size 1.2em" /div div id="inter" style="font-size 1.2em" /div div id="success" style="font-size 1.2em; color green" /div div id="failure" style="font-size 1.2em; color red" /div div id="complete" style="font-size 1.2em; color green" /div p %= submit_tag 送信 % /p %= end_form_tag % 遷移させないということは a RailsでのAjax利用の構造 a 自作のJavaScriptはどこに書くのか? link サーバ内テンプレートを元にコンボボックス表示 a リクエストの判別方法 a DBの値を元にコンボボックス表示 a 定期的なリクエスト実行 定期的な実行を伴うAjaxの処理は、「PeriodicalExecuter」を使用しますが、Railsではこれをさらにラップして「periodically_call_remote」というメソッドを使用します。 ここでは、サンプルとして、クライアント側から非同期に、ブラウザを利用しているユーザからは意識させずに、サーバーにアクセスし、サーバ上にあるDBの最新情報を取得して、それを画面を遷移させることなく表示するサンプルを作成してみます。 対象の画面:index3 イベント:タイマー 定期実行時間:3秒 リクエスト先のコントローラ:greeting リクエスト先のアクション:select_todos_by_mysql レスポンス先のエレメントID:complete とすると、 1、Viewは(greeting/index3.html.erb) hr/ %=periodically_call_remote( update = "complete", frequency = 3, url = { action = select_todos_by_mysql}, position = "top", success = "$( complete ).innerHTML = ", loading = "", loaded = "", interactive = "", failure = "") % div id="success" style="font-size 1.0em; color green" /div div id="complete" style="font-size 1.0em; color green" /div 2、コントローラは(greeting_controller.rb) def select_todos_by_mysql if request.xml_http_request?() @stmt = @con.createStatement rs = @stmt.executeQuery("select * from todos") str = while rs.next str += rs.getString(3) str += " br / " end puts str render text = str end end になります。(ここでDB接続と切断は他のアクションでも共通処理になるはずなので外だしすることにします。※後述します。)ここで、request.xml_http_request?()は非同期でリクエストされた時のみ処理するための記述です。 機能の内容をみてみましょう。 periodically_call_remoteメソッド update = レスポンス先のエレメントID指定, frequency = 秒数, url = { action = アクション名( メソッド名)}, position = 挿入場所, success = レスポンス完了前の直前処理, 変換後のHTMLは script type="text/javascript" // ![CDATA[ new PeriodicalExecuter(function() {new Ajax.Updater( complete , /greeting/select_todos_by_mysql , {asynchronous true, evalScripts true, insertion Insertion.Top, onFailure function(request){}, onInteractive function(request){}, onLoaded function(request){}, onLoading function(request){}, onSuccess function(request){$( complete ).innerHTML = }, parameters authenticity_token= + encodeURIComponent( e4a2e3f8ab38073ed2a9d8acaced418f8042a651 )})}, 3) //]] /script div id="success" style="font-size 1.0em; color green" /div div id="complete" style="font-size 1.0em; color green" /div これだけの記述で、タイマーによる非同期処理が実現できます。 なお、DBアクセスの部分は、今回「ActiveRecordを使わないやりかた」として、通常の「DriverManagerによる接続」を実装してみました。しかし、これはJrubyOnRailsによるJDBC接続となるため、ここでのトピックとしてのテーマとずれますが、実現方法はいたって簡単です。使用するDBのJDBCドライバを使用するRubyのlibフォルダに格納し使います。 DB接続と切断をアクション共通処理としてくくりだしたいので、 DB接続(共通処理:除外するアクションも指定可能) アクション:DB操作 DB切断(共通処理:除外するアクションも指定可能) こういう処理の流れが太枠になります。この構成をRailsで行うには、事前処理と事後処理ということで、 # DB接続部分は外だしし、メソッドの前に実行させる。 before_filter db_connect, except = [ index, index2, index3, index4] # DB切断は外だしし、メソッドの前に実行させる。 after_filter db_close, except = [ index, index2, index3, index4] を定義し、 private def db_connect begin java.lang.Class.forName( com.mysql.jdbc.Driver ).newInstance @con = java.sql.DriverManager.getConnection( jdbc mysql //localhost/JRoR2MySQLTom01_development , root , ); # rescue = ex # @message = error occureed !!! # ensure # @con.close if @con end end def db_close @con.close if @con end を実装します。この処理は「除外指定されていないメソッド」である「select_todos_by_mysql」の前後に差し込まれて実行されるため、DBの接続切断処理が自動的に行われる結果となります。 リクエスト情報 a
https://w.atwiki.jp/vocaloidenglishlyric/pages/341.html
【Tags Signal-P T tT Rin】 Original Music title Transmit English music title Transmit Music Lyrics written, Voice edited by シグナルP (Signal-P) Music arranged by シグナルP (Signal-P) Singer 鏡音リン (Kagamine Rin) Click here for the original Japanese Lyrics English Lyrics (translated by moire25): The moon floats faintly, the stars remain dimly I sent my wish from here by reaching my hand I put it in words and smile, not to lose It s so easy to go with the flow, but even so, Do not forget that it s important to go against the tide Hold it tight once again, pledge and carve it into your heart Every time I feel wistful, a gentle light shines Though I can t make the linked story dramatic At least I will even smile to the end the day I cry I couldn t do anything in the past I wonder if I could give warmth even just a little I wonder if I can change something in the future I m overwhelmed by anxieties and sorrows The flowing gentle sound is faintly turned blue Recall the overflowing strength from here Even if you chase and lost it, rely on a glimmer of a clue I m sure it s still nearby, so don t give up Be honest to the heart crying out. You can hear it if you close your eyes. Then, it certainly show the way to go Hold it tight once again, pledge and carve it into your heart Every time I feel wistful, a gentle light shines Though I can t make the linked story dramatic At least I will even smile to the end the day I cry And now I ll just believe my feelings will reach you... I ll be by your side, so I ll the tears and I won t get away any more. lalala… Romaji lyrics (transliterated by moire25): kasukani ukabu tsuki ussura nokoru hoshi tachi te wo nobashi te koko kara todokeru negai dokomademo tooku te hate naku todoki sou mo nai kotoba ni nose hohoemu make nai you ni nagare ni mi wo makasu no wa kantanda keredo sore demo sakarau koto mo daiji da to wasure nai de dakishime te ima mou ichido sono mune ni chikatte kizami kon de setsunasa kanjiru tabi sosogu yasashii hikari tsunagatte iru monogatari doramachikku ni nado deki nai keredo nai ta hi mo saigo ni wa seme te egao de owatte ima made no jibun wa nani mo dekina katta kedo sukoshi demo nukumori wo tsutae re ta kana korekara no jibun wa nani ka kae rare ru no kana fuan ya kanashimi ni oshitsubu sare sou de nagareru odayakana oto honokani aoku irozui te afureru tsuyosa wo koko kara yobisamashi te oikake te miushi natte mo chiisana tegakari wo tayori ni shi te chikakuni mada iru hazu dakara akirame nai de me wo tojire ba kikoe te kuru kokoro no sakebi ni sunao ni natte sou sure ba hitsuzen to susumu michi ga otozureru dakishime te ima mou ichido sono mune ni chikatte kizami kon de setsunasa kanjiru tabi sosogu yasashii hikari tsunagatte iru monogatari doramachikku ni nado deki nai keredo nai ta hi mo saigo ni wa seme te egao de owatte soshite ima wa tada omoi ga todoku to shinji te... soba ni iru kara namida wo fuite mou ni ge nai lalala... [SignalP, Signal-P, Sigunaru-P, SigunaruP, Dios, Hiroaki Arai]
https://w.atwiki.jp/sakadai/pages/13.html
mac 10.6 32bitで動かすPCにmysqlを導入する。 普通にやったら。。。まったく動かなかったのでここにメモしておこう。 http //nshun583ts.wordpress.com/2011/02/25/mac_sql_upgrade/ これをもとに。。。 etc/my.cnf の#default-character-set = utf8 の2カ所をコメントあうと。ここでエラーがでていた。 そのあと、 sudo /usr/local/mysql/bin/mysql -u root で起動! いや ほんとながかった。。。あとは ここから原因を探ろう。
https://w.atwiki.jp/orbiter_transx/pages/15.html
まず、Setupのビュー(VW(Fig3.1.1.青丸)を押すとビューが変わります)で、VARを押し、Select Target Planets/Moonsの設定画面にします(Fig3.1.1.緑丸)。 現在、地球を周回、もしくは地上にいるので地球の重力を離脱しないといけません。 そこで、++を何度か押してEscapeを選びます(――を押すと逆順で動作します)(Fig3.1.1.赤丸)。 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fig3.1.1.jpg) Fig 3.1.1 Stage 1 setup 次に、地球の重力を離脱したら、太陽を周回しながら火星に向かわないといけません。 そのためにFWDボタンを押して、次のステージを作成します。 Stageの表示が2:2になりますが、これは2つあるステージの2つ目であることを示します。 ステージ1で地球の重力を離脱したものも、第3宇宙速度以下なので太陽の周りを周回する軌道が表示されます(また軌道成分を変更していないので地球とほぼ同じ速度(厳密には地球の公転と、宇宙船が地球の周りを自転する速度をあわせた合成速度)で太陽を周回する軌道が出ます)。 先ほどと同様にSETUPのビューでTargetの設定画面にします。 ここで++もしくは――を何度か押してMarsを選びます。 現在の宇宙船の軌道の外側に、火星の軌道が表示されます。 Fig 3.1.2において中心にあるのが太陽、内側の円が地球軌道、外側の円が火星軌道で中心から放射状に伸びる線の公転にそれぞれの惑星があります。 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fig3.1.2.jpg) Fig 3.1.2 Earth and Mars s orbit VWボタンをおしてビューをEject Planに変更します。 VARボタンを押すと、Prograde vel.→Eject date→Outward vel.→Ch. plane vel.の順に設定する変数がかわります。-VRボタンを押すと逆順に変化します。 変数の値は++と--で変化させることができます。ボタンを押したときの変化量はADJ、-ADJで調整できます。 Coarse→Medium→Fine→Super→Ultra→Resetの順に変化します。 変化量はCoarse>Medium>Fine>Super>Ultraの順で、Resetの時に++を押すと、その変数が0(Eject dateの時にResetをすると現時刻)になります。 変数を変化させると、変化させた軌道において一番接近する時の火星と宇宙船の位置が点線で表示されます。また、貫くように実線で表示されている線が、軌道が交差する点です。 Prograde vel.(軌道方向)を増やすと、軌道が(現在の位置が近日点となり反対側が遠日点となり)外側に伸びていきます(緑矢印)。減らすと逆になります。 Eject dateを変更すると、地球が太陽を公転するのに応じて、軌道が伸びていく向きが変わります。なお、Eject dateは現時刻より前だと意味が無いですから、必ずシミュレータ画面右上のMJDに表示される現時刻よりも後に設定してください。 Outward vel.(太陽から遠ざかる方向)を増やすと軌道が現在の位置から外側に飛び出すように外側に伸びていきます(が、Prograde velを増やすよりやや効率が悪くなります)(水色矢印)。 Ch. plane vel.(NormalもしくはAnti Normalで軌道面を変える方向)を調整して、最接近点で軌道が交差するようにします(赤矢印)。ただし、この変数を変えるとかなり軌道が変わってしまうので、様子を見ながら軌道速度を減らしたりして調整してください。 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fig3.1.3.jpg) Fig 3.1.3 Targeting to mars このとき、MFD左に表示されるCl. App. (rough)というのがClosest approach distanceの略で、下に表示される数字が最接近時の概算距離(メートル単位)です。火星の場合はおよそ1G以下(xxxM表示)くらいになればよいそうです。 あとで調整できますし、地球の影響がほとんどなくなってから修正する必要があります。 大体、満足がいく値になったら、変数のEject dateの数字をメモしておいてください(水色の囲み)。これが、火星に向かうための出発時刻になります。 なお、黄色の囲みのEnc. MJDが再接近時刻、Enc. Vが再接近時の相対速度です。 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (fig3.1.4.jpg) Fig 3.1.4 Cl. App reachs less than 1 Gigametres ここまでの操作を試験的に動画でアップロードしました。 http //www36.atwiki.jp/orbiter_transx/pub/set_to_mars_mp4.avi さて、ここで、地球から火星に向かう軌道が決まりましたので、この軌道に乗せるために地球を離脱する起動を決める必要があります。 そこでBCKボタンを押してステージ1にもどります(ステージ表示1:2) 地球を離れる双曲線軌道が表示されています。 ここで、VWを押してEscape Planビューにします。 Escapeステージで変化できる変数はPe DistanceとEj Orientationです。 Pe Distanceは、デルタグライダーのオートパイロットを使用した場合、230Km~270Kmの円軌道にのりますから、6.37M+230Kmで、6.6Mくらいに設定するといいでしょう。軌道上にいる場合は、現在の軌道とあわせてください。 Ej Orientationは軌道上にいる場合はR.Incがなるべく小さくなるところ、地上にいる場合は今いる地点の上空を離脱する軌道が通るように動かしましょう。 これを見るにはSetupのビューでVARをいくつか押すと、Graph Projectionという変数が変更できるようになるので、これをFocusにします。地球の中心から地表までの緑色の楕円軌道が地表に接する点が現在地点です。軌道がクロスする線がこの地点を通るように回転させます。 うまくいかない場合は、とりあえず今はあわせなくてもいいです。出発する直前に再度調整しますから。 これで準備の項を終わります。
https://w.atwiki.jp/maha/pages/46.html
A-1 SELECT student_name AS "受講者の名前",kind AS "登録番号",teacher_name AS "教官の名前" FROM student,resurve,teacher,car,dispatch WHERE resurve.class_date = 2008-06-11 AND resurve.class_time = 4 AND resurve.student_no = student.student_no AND resurve.teacher_no = teacher.teacher_no AND dispatch.car_no = car.car_no AND dispatch.resurve_no1 = resurve.resurve_no ; 受講者の名前 登録番号 教官の名前 道下 正樹 3321 佐々木 孝 山川 純一 2132 別所 直木 (2 rows) A-2 SELECT kind AS "登録番号" FROM car WHERE kind LIKE %32 AND mt_flag = 0 ; 登録番号 2132 1432 2632 (3 rows) A-3 SELECT student_name AS "受講者の名前",student.tel AS "受講者のTEL",cancel.regi_time AS "キャンセル待ち登録日時" FROM student,cancel WHERE cancel.student_no = student.student_no AND cancel.class_date = 2008-06-13 AND cancel.class_time = 2 ORDER BY cancel.regi_time ; 受講者の名前 受講者のTEL キャンセル待ち登録日時 大石 宏美 090-0000-0004 2008-06-03 15 46 00 道下 正樹 090-0000-0003 2008-06-06 13 50 00 (2 rows) B-1 SELECT COUNT(car_no) AS "20080614の4時限のAT車の空数" FROM car WHERE mt_flag = 0 AND car_no NOT IN ( SELECT dispatch.car_no FROM dispatch WHERE dispatch.resurve_no1 IN ( SELECT resurve_no FROM resurve WHERE resurve.class_date = 2008-06-14 AND resurve.class_time = 4 AND cancel_day = 0000-01-01 ) ) ; 20080614の4時限のAT車の空数 4 (1 row) B-2 SELECT class_date AS "日付",class_time AS "時刻",COUNT(class_date) AS "予約数" FROM resurve WHERE resurve.class_date BETWEEN 2008-06-10 AND 2008-06-15 AND cancel_day = 0000-01-01 GROUP BY class_date,class_time ORDER BY class_date,class_time ; 日付 時刻 予約数 2008-06-11 4 2 2008-06-13 2 3 2008-06-14 4 3 2008-06-15 3 1 (4 rows)
https://w.atwiki.jp/legendofnorrath/pages/369.html
Update Notes for January 31st, 2008 ****************************** General- Fix for the delivery window to correctly show item quantities when multiple transactions contain the same product. - Legends of Norrath text has been removed from product names to make confirming Trades and Posted Trades easier to review. - Delivery window now supports scrolling through current transactions with the arrow keys. - Open Deck and Save Deck dialogs now support using the arrow keys. - Forsworn Scenario Text Changes - Chapter 1 prologue is no longer cut short. - In Scenario 7, Semkarr’s player name has been shortened. - Scenario 9 no longer says, after suffering a grievous injury , and mention of the Oathbound Acolytes fighting for you has been added.
https://w.atwiki.jp/know-unix/pages/53.html
To avoid cursor error in Trados workbench (trados 7), use draft mode in Word 2007. To import TMX files to Trados 2007 TMW file. encoding="utf-8" で、ファイルももちろん UTF-8 形式で保存されています。 ところが、SDL Trados 2007 Workbench にインポートするファイルは、UTF-16 でなければならないのでした。したがって、*.tmx ファイルをまずテキストエディタで開き、1 行目を次のように書き換えます( 8→16 にするだけ) ?xml version="1.0" encoding="utf-16"? そのうえで、ファイル自体も UTF-16 で保存し直します。こうすれば、Trados Workbench に無事インポートできます。 ちなみに、Workbench 側から *.tmx 形式でエクスポートしたファイルには、なんと encoding 指定がありません。 SAVE as UNICODE with メモ帳 to achieve UTF-16 If you encounter macro errors in Word 2007 after updating SDL or Multiterm, try renaming all files with .exd and files such as multiterm.dot extensions to .bak http //jpn.proz.com/forum/sdl_trados_support/181852-update_sp3_trados_studio_error_message_multiterm.html If crap (tag) shows up in Trados 2007 in conjunction with Word 2007, press the following keys CTRL+* - show/hide hidden text (CTRL+SHIFT+8) Seems to work well.... "SDL XLIFF validation error at line 3353 offset 1236 The key sequence 210" in Keyref fails to refer to some key." I did not figure out until now that "key sequence 210" means "segment 210." Best way to fix this problem is the following. 1. Rename the original source file 2. Add the above file as a new source file 3. Auto prepare this file 4. Find the segment where the cause of this problem was, "key sequence 210" in this case. 5. Do not merge this segment, but do a concordance search on the TM for this segment. 6. Apply this the search result as the translation. If you encounter an error message with the following messege, below is a way to bypass. "MoveToLastChild" 1. Use Open Document instead of Create a Project with your source file. 2. Select the TM containing the translations 3. Do not press save or a project will be created 4. Use translate until next unconfirmed to get through your translation quickly 5. Now try to save the target eol
https://w.atwiki.jp/gpsgps/pages/56.html
このページは? Transystem製のロガー もくじ photoMate887 i-Blue821 i-Blue757 i-Blue747DataLogの吸出しがうまくいかなすぎる件 i-Blue737 i-Blue 747A+ TripMate 850 TripMate 852 掲示板 タグリスト photoMate887 最強伝説。 仕様:http //www.transystem.com.tw/products/index_detail.php?mcat_no=2 cat_no=33 pno=21 ver=en(英語) 詳細は略。 -- 名無しさん (2009-01-09 20 46 26) 名前 コメント i-Blue821 wbt-201も飽きてきたので、i-blueを買うかと思ってる。もしかすっと821になるかも -- 名無しさん (2008-02-15 17 25 18) 747買ったから821は買わない -- 名無しさん (2008-06-02 11 48 05) 名前 コメント i-Blue757 アンテナ部 厚さ9mm 本体16mm ログの設定により SightField プレテストサービスに放り込めるファイルを出力可能 -- 名無しさん (2007-08-31 23 31 45) DataLog.exeでDownLoadがうまくいかないとき ・SWをLOGモードにする ・ConnectしDataLogListでStopLogする ・Disconnectし再びConnect ・DownLoadする -- 名無しさん (2007-09-09 11 21 18) 名前 コメント i-Blue747 DataLogの吸出しがうまくいかなすぎる件 Windows 2000(笑) USB1.1(笑) PTM-UBT3S NAVモードでPCとBT接続 かつ USBケーブルでUSB接続 上記ハードウェア構成で、DataLogはUSBのポートへ接続、Download。 これでいままで見たことないスピードで吸い出されました(ただしログ容量は8%のみ)。 とりあえずメモしときます(7/16)。 wbt-201より一回りでかい -- 名無しさん (2008-05-02 10 09 45) GpsBabelでの吸い出し方法 入力形式をmtkにして、入力ファイル名のかわりにスペシャルファイル(windowsだとなんていうんだっけ) を指定すればOK ポートがCOM10だったら gpsbabel -i mtk -f COM10 -o gpx -F OUTPUTFILE.gpx とかで -- ☆★☆モバイルGPSスレッドその22☆★☆ 59転載 (2008-06-11 22 39 19) このデカさは汎用バッテリだからさ。Nokia用で世界中でGet可能。 -- 名無しさん (2009-08-04 00 03 37) 名前 コメント i-Blue737 名前 コメント i-Blue 747A+ 仕様:http //www.transystem.com.tw/products/index_detail.php?mcat_no=2 cat_no=33 pno=55 ver=en(英語) ユーザーマニュアル:ttp //www.gpsdgps.com/product/gpsdgps_dl/090325/trs_747a_mj_ver100.pdf(某旭川) 名前 コメント TripMate 850 仕様:http //www.transystem.com.tw/products/index_detail.php?mcat_no=2 cat_no=33 pno=58 ver=en(英語) AAA batteryで駆動しログはMicro SDに記録されるらしい・・・ AAA battery 2本で駆動します(eleloop実績アリ)。付属のMicro SDには、1Gまでログできます。 -- 14階 (2011-10-26 09 29 25) 名前 コメント TripMate 852 仕様:http //www.transystem.com.tw/products/index_detail.php?mcat_no=2 cat_no=33 pno=56 ver=en(英語) AAA batteryで駆動しログはMicro SDに記録されるらしい・・・ http //www.transystem.jp/index.html -- 2009/7/30 TripMate850とPhotoMate887がブルートゥース技術適合証明を取得しました。 (2009-09-09 07 45 36) V2.2を当てました。良いところ(Sleepでログが分かれない、移動中Sleepにならない)、悪いところ(GSA,GSVが無くなった)、その他() -- 名無しさん (2010-09-27 21 22 47) 名前 コメント 掲示板 photoMate887、さいこうだわ -- 名無しさん (2009-01-04 12 44 28) http //spreadsheets.google.com/pub?key=pyCLH-0TdNe-5N-5tBokuOA gid=5 -- iBlue 747/757 - Qstarz BT-Q1000 - iTrek Z1 - Commands (2009-02-07 08 53 43) 747A+と新製品について追加 -- 名無しさん (2009-06-13 21 08 58) 名前 コメント タグリスト Bluetooth Micro SD Transystem ロガー bookmark_fc2 bookmark_saaf bookmark_delicious bookmark_nifty bookmark_hatena bookmark_yahoo bookmark_livedoor